(* Release 3.00 *)

(*    c_coreinit - common initialisation between PLIB and CLIB *)

(*    Copyright (C) 1991 Psion PLC. All Rights Reserved*)
(*    Written by NSM.*)

include "corelib.inc"
include "epocdefs.inc"

module coreinit

(***************************************************************************)
section
segment _MAGIC(MAGIC,68H)
segment _DATA(DATA,68H)
segment _CONST(DATA,48H)
segment _BSS(BSS,68H)
segment BSS_END(BSS,68H)

group DGROUP(_MAGIC,_DATA,_CONST,_BSS,BSS_END)

select _DATA

public _winHandle : dw	0
public __conName : db	'CON:*',0

(***************************************************************************)
section
segment _DATA(DATA,68H)
public __DefScreenRect : dw	-1,0,0,0

(***************************************************************************)
section
segment _DATA(DATA,68H)
public __DefScreenMode : dw	0

(****************************************************************************)
section
segment _TEXT(CODE,28H)

public __FatalErrorPos :

    push bx
    mov  bx, sp
    mov  ax, ss:[bx][2]
    pop  bx
    ret  0

(****************************************************************************)
section
segment _TEXT(CODE,28H)

public __FatalError :

    mov  al, 80
    int	 ProcPanic

(****************************************************************************)
section
segment _TEXT(CODE,28H)
segment _DATA(DATA,28H)

extrn _winHandle
extrn _DatCommandPtr
extrn __DefScreenRect
extrn __DefScreenMode
extrn __conName

select _TEXT

extrn __FatalErrorPos
extrn __FatalError

xMode	=	-2
xParse	=	xMode-FullParseEnt
xBuf	=	xParse-MaxPathSize

public _p_xwind :
	push	bp
	mov	bp, sp
	add	sp, xBuf
	push	ax
	push	bx
	push	cx
	push	dx
	push	di
	push	si
;
	mov	bx, [_DatCommandPtr]
	test	bx, bx
	je	noCommandLine
	sub	cx, cx
	lea	di, [bp][xBuf]
	lea	si, [bp][xParse]
	sub	al, al
	mov	ah, NmFilParse
	int	FilManager
	jc	noCommandLine
	lea	di, [bp][xBuf]
	mov	si, __conName
	int	StringCopy
	add	di, 5
	lea	si, [bp][xBuf][FileSystemNameSize]
	mov	ax, [bp][xParse][FullParseDevice]
	add	al, ah
	sub	ah, ah
	add	si, ax
	mov	cl, [bp][xParse][FullParseName]
	sub	ch, ch
	cld
	rep ;	movsb
	sub	al, al
	stosb
	jmp	openCon
noCommandLine:
	lea	di, [bp][xBuf]
	mov	si, __conName
	int	StringCopy
	mov	byte [di][4], 0
openCon:
	lea	bx, [bp][xBuf]
	mov	cx, -1
	mov	ah, NmIoOpen
	int	DevManager
	jnc     openOk
;
	call	__FatalErrorPos
	mov	bx, FatalOpenConsole
	jmp	__FatalError
;
openOk: mov	[_winHandle], ax
;
        mov     si, ds:[Datawserv_channel]
        or      si, si
        jz      old_window_server
        mov     al, [si][wserv_spec_info_version]
        and     al, 0FH
        cmp     al, 2                (* WS_VERSION_4 *)
        jb      old_window_server
;
        sub     sp, 32               (* SIZE W_SUPPORT_INFO *)
        mov     si, sp
        mov     ax, 0FF06H           (* WOR_X_SUPPROT_INFO *)
	int     WservOpcodes
        mov     ax, [__DefScreenMode]
        mov     bx, [si]
        add     sp, 32               (* SIZE W_SUPPORT_INFO *)
;
        test    bx, 2                (* W_SUPPORT_CTBY_S3 *)
        jz      no_ctby_mode
        test    ax, 1                (* Use compatibility mode if set *)
        jnz     no_ctby_mode
        push    ax
        push    bx
	mov	word [bp][xMode], 20 (* P_SCR_COMPATIBILITY *)
	lea	cx, [bp][xMode]
        xor     ax, ax               (* No compatibilty mode *)
        push    ax
	mov	dx, sp
	mov	bx, [_winHandle]
	mov	al, IoFuncSet
	mov	ah, NmIoWithWait
	int	IoManager
        pop     ax
        pop     bx
        pop     ax
;
no_ctby_mode:
        test    bx, 1                (* W_SUPPORT_CTBY_GREY *)
        jz      no_grey
        test    ax, 2                (* Use grey if set *)
        jz      no_grey
;
	mov	word [bp][xMode], 21 (* P_SCR_GREY *)
	lea	cx, [bp][xMode]
        mov     ax, TRUE
        push    ax
	mov	dx, sp
	mov	bx, [_winHandle]
	mov	al, IoFuncSet
	mov	ah, NmIoWithWait
	int	IoManager
        pop     ax
no_grey:
;
old_window_server:
	mov	di, __DefScreenRect
	cmp	word [di][RectTl][PointX], -1
	jne	rectGood
	sub	ax, ax
	mov	[di][RectTl][PointX], ax
	mov	[di][RectTl][PointY], ax
	mov	ah, NmGenLcdType
	int	GenManager
	mov	bx, 60
	mov	cx, 15
	cmp	al, Lcd240X80
	jne	try160X80
	mov	bx, 40
	mov	cx, 9
	jmp	setBr
try160X80:
	cmp	al, Lcd160X80
	jne	setBr
	mov	bx, 26
	mov	cx, 9
setBr:
	mov	[di][RectBr][PointX], bx
	mov	[di][RectBr][PointY], cx
rectGood:
	mov	word [bp][xMode], 5 (* P_SCR_WSET *)
	lea	cx, [bp][xMode]
	mov	dx, di
	mov	bx, [_winHandle]
	mov	al, IoFuncSet
	mov	ah, NmIoWithWait
	int	IoManager
;
	mov	word [bp][xMode], 3 (* P_SCR_POSA *)
	lea	cx, [bp][xMode]
        xor     ax, ax
        push    ax
        push    ax
        mov     dx, sp
	mov	al, IoFuncSet
	mov	ah, NmIoWithWait
	int	IoManager
;
	lea	di, [bp][xParse]
	mov	word [di], 1
	mov	dx, di
	mov	word [bp][xMode], 9 (* P_SCR_CURSOR *)
	mov	al, IoFuncSet
	mov	ah, NmIoWithWait
	int	IoManager
;	
	pop	si
	pop	di
	pop	dx
	pop	cx
	pop	bx
	pop	ax
	mov	sp, bp
	pop	bp
	ret     0
;

(****************************************************************************)
section
segment _TEXT(CODE,28H)

public _ClassTable :
public _ExtCatTable :
        dw      0

end
